xargs 实战技巧
传递文件名
比如当前目录下有两个 7z 文件:
$ ls | grep 7z
TreeSizeFree-Portable.zip.7z
TreeSizeFreeSetup.exe.7z
我想实现的效果是直接使用管道命令进行解压,如下:
$ ls | grep 7z | 7z x -
显而易见,执行失败。原因是因为 7z 命令需要的是一个文件名,但是 - 是一个标准输入流(会将上一个管道的输出作为该管道的输入)。
这个时候可以尝试使用 xargs -I <占位符> 解决:
$ ls | grep 7z | xargs -I {} 7z x {}
xargs -I {} 将每个匹配的文件名替换到 {} 中,并执行 7z x {} 进行解压。
{} 是 xargs 中的一个占位符,表示将匹配到的内容替换到它所在的位置。这里使用 {} 只是习惯使然,不是固定的符号。你可以使用其他任意字符来表示这个占位符。只要确保替换字符在命令中没有引起歧义即可,比如使用 @:
$ ls | grep 7z | xargs -I @ 7z x @